home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 07, No. 05 (1986-05)(MicroSPARC)(Side A).zip / Nibble Volume 07, No. 05 (1986-05)(MicroSPARC)(Side A).po / LIBRARIAN.S < prev    next >
Text File  |  1996-12-24  |  29KB  |  955 lines

  1.           LST ON,NOA,G
  2.                          ;
  3.           REP 32
  4. *                              *
  5. *          LIBRARIAN           *
  6. *        by Ken Manly          *
  7. *                              *
  8. *     Copyright (C)  1986      *
  9. *       MicroSPARC, Inc.       *
  10. *      45 Winthrop Street      *
  11. *      Concord, MA  01742      *
  12. *                              *
  13.           REP 32
  14. *    EDASM.SYSTEM assembler    *
  15.           REP 32
  16.                          ;
  17. HIMEM     EQU $73
  18. IPTR      EQU $EE
  19. DATPTR    EQU $FA
  20. SCTPTR    EQU $FC
  21. PRTPTR    EQU $FE
  22. INPUT     EQU $200
  23. DEFSLT    EQU $BE3C
  24. DEFDRV    EQU $BE3D
  25. VPATH1    EQU $BE6C
  26. GOSYSTEM  EQU $BE70
  27. BADCALL   EQU $BE8B
  28. CRACESS   EQU $BEA3
  29. CRFILID   EQU $BEA4
  30. CRAUXID   EQU $BEA5
  31. CRFKIND   EQU $BEA7
  32. SREFNUM   EQU $BEC7
  33. SUNITNUM  EQU $BEC7
  34. SBUFADR   EQU $BEC8
  35. SMARK     EQU $BEC8
  36. OSYSBUF   EQU $BECE
  37. OREFNUM   EQU $BED0
  38. RWREFNUM  EQU $BED6
  39. RWDATA    EQU $BED7
  40. RWCOUNT   EQU $BED9
  41. CREFNUM   EQU $BEDE
  42. MLI       EQU $BF00
  43. DEVCNT    EQU $BF31
  44. DEVLST    EQU $BF32
  45. MACHID    EQU $BF98
  46. PFIXPTR   EQU $BF9A
  47. KBD       EQU $C000
  48. KBSTRB    EQU $C010
  49. TABV      EQU $FB5B
  50. CLREOP    EQU $FC42
  51. HOME      EQU $FC58
  52. RDKEY     EQU $FD0C
  53. NXTCHAR   EQU $FD75
  54. CROUT     EQU $FD8E
  55. COUT      EQU $FDED
  56. BELL      EQU $FF3A
  57. SETV      EQU $FF58      ;Known $60 to set V bit
  58.                          ;
  59.                          ;ProDOS MLI function call codes
  60.                          ;
  61. RDBLK.C   EQU $80
  62. CREATE.C  EQU $C0
  63. ONLINE.C  EQU $C5
  64. OPEN.C    EQU $C8
  65. WRITE.C   EQU $CB
  66. CLOSE.C   EQU $CC
  67. SETMARK.C EQU $CE
  68. GETMARK.C EQU $CF
  69. SETEOF.C  EQU $D0
  70. GETEOF.C  EQU $D1
  71.                          ;
  72.           MSB ON
  73.           ORG $1000
  74.           REP 32
  75.           JSR HOME
  76.           LDX #BANNER1-BANNER0
  77.           LDY #0         ;Print greeting
  78. BNRLP     LDA BANNER0,Y
  79.           BIT MACHID
  80.           BMI BNROUT     ;On Apple II,
  81.           JSR UPCASE     ; change lower case to upper
  82. BNROUT    JSR COUT
  83.           INY
  84.           DEX
  85.           BNE BNRLP
  86.                          ;
  87.                          ;Top level of LIBRARIAN
  88.                          ;
  89. START     CLC
  90.           LDA HIMEM+1    ;Use system buffer
  91.           STA IBUF       ; for catalog sector
  92.           ADC #2
  93.           STA IBUFTOP    ;Limit for scanning input buffer
  94.           SBC #13
  95.           STA DBUFTOP    ;Limit for data buffer
  96.           LDA #<END+$100 ;Beginning of data buffer
  97.           STA DATPTR+1
  98.           LDA #0
  99.           STA DATPTR
  100.           LDY DEVCNT     ;Number of disk drives
  101.           INY
  102.           STY IDEV       ;Initialize drive selector
  103. GETDSK    JSR SRCEPRMPT  ;Ask for disk
  104.           BCC GO
  105.           BCS WRITEOUT
  106. TRYAGAIN  JSR READERR
  107.           BCS WRITEOUT
  108. GO        LDY #<READMSG
  109.           LDX #>READMSG
  110.           LDA #10
  111.           JSR MESSAGE
  112.           JSR FINDDSK    ;Identify disk
  113.           BCS TRYAGAIN
  114.           LDA #$80
  115.           STA FIRSTBLK   ;Indicate start new catalog
  116.           LDY #<READMSG
  117.           LDX #>READMSG
  118.           LDA #10
  119.           JSR MESSAGE
  120.           BIT DISKID
  121.           BPL CTPS       ;Bit 6 clear for Pascal
  122.           BVS CTPD       ;Bit 7 set for ProDOS
  123.           BVC CTD3       ;Bit 7 clear for DOS 3.3
  124. CTPS      JSR PASCAT     ;Do Pascal disk
  125.           BCS ERROR
  126.           BCC CHKSPACE
  127. CTPD      JSR PROCAT     ;Do ProDOS disk
  128.           BCS ERROR
  129.           BCC CHKSPACE
  130. CTD3      JSR DOSCAT     ;Do DOS disk
  131.           BCS ERROR
  132. CHKSPACE  LDA DATPTR+1
  133.           CMP DBUFTOP
  134.           BCC GETDSK     ;Still room for more
  135.           JSR BELL
  136. WRITEOUT  LDA DATPTR
  137.           BNE WROUT      ;Any data to file?
  138.           LDA DATPTR+1
  139.           CMP #<END+$100
  140.           BEQ ENDITALL   ;No
  141. WROUT     JSR DESTPRMPT
  142.           BCS ENDITALL
  143.           JSR OUTFILE    ;Write file information
  144.           BCS WROUT1
  145.           JMP START      ;Do it again
  146. WROUT1    JSR WRITERR
  147.           JMP WROUT
  148. ENDITALL  LDY #<BYE
  149.           LDX #>BYE
  150.           LDA #14
  151.           JSR MESSAGE
  152.           LDA #$0D
  153.           STA INPUT
  154.           CLC
  155.           RTS
  156.                          ;
  157.                          ;Error handling
  158.                          ;
  159. ERROR     STA ERRCODE    ;Save error code
  160.           LDA #0
  161.           STA CREFNUM
  162.           LDA #CLOSE.C   ;Close all files
  163.           JSR GOSYSTEM
  164.           SEC            ;Indicate error
  165.           LDA ERRCODE    ;Get error code
  166.           BNE ERROR1     ;Error was real
  167.           CLC            ;Error was a fake to
  168.           RTS            ; escape
  169. ERROR1    LDX #>RDERRMSG
  170.           LDY #<RDERRMSG
  171.           JSR PROMPT
  172.           JMP CHKSPACE   ;Back into the program
  173.           REP 32
  174.                          ;
  175.                          ;Subroutine to find a disk
  176.                          ;
  177. DEVLP     LDY DEVCNT     ;Number of disk drives
  178.           INY
  179.           STY IDEV
  180.           BIT KBD
  181.           BPL FINDDSK
  182.           SEC            ;Abort on keystroke
  183.           LDA KBSTRB
  184.           LDA #8         ;Fake error
  185.           BCS DEVRTN
  186. FINDDSK   DEC IDEV
  187.           BPL NXTDEV
  188.           BMI DEVLP
  189. NXTDEV    LDY IDEV       ;Pick a drive from
  190.           LDX DEVLST,Y   ; device list
  191.           TXA
  192.           AND #$0F       ;Look at device ID
  193.           BNE FINDDSK    ;Not a Disk II
  194.           TXA
  195.           AND #$F0       ;Isolate device number
  196.           STA BRWUNIT    ;Save in parm list
  197.           JSR RDIDBLK    ;Try to identify disk
  198.           BCS FINDDSK    ;Not there
  199. DEVRTN    RTS
  200.                          ;
  201.                          ;Subroutine to identify DOS 3.3, ProDOS,
  202.                          ; or PASCAL disks by characteristic bytes
  203.                          ;
  204. RDIDBLK   LDA IBUF
  205.           STA IPTR+1
  206.           LDA #0
  207.           STA IPTR
  208.           LDX #2         ;Read block 2
  209.           JSR READBLK
  210.           BCS RDIDRTN
  211.           LDY #2         ;Examine byte 2
  212.           LDA (IPTR),Y   ;Get ID byte
  213.           LDY #7
  214. IDLP      CMP IDLIST,Y   ;Look for it
  215.           BEQ GETIDBYTE  ; in the list
  216.           DEY            ; of acceptable
  217.           BPL IDLP       ; bytes
  218.           LDA #6         ;Not found, load
  219.           SEC            ; fake volume not found
  220.           BCS RDIDRTN    ; error
  221. GETIDBYTE LDA IDBYTES,Y  ;Found, load and save the
  222.           STA DISKID     ; corresponding code
  223.           CLC            ;If C clear,
  224. RDIDRTN   RTS            ; DISKID is valid
  225.                          ;
  226.                          ;Main subroutine to handle PASCAL directory
  227.                          ;
  228. PASCAT    LDA #2
  229.           STA CURBLK     ;Start with block 2
  230. PASCATLP  LDX CURBLK
  231.           LDA #0
  232.           JSR READBLK
  233.           BCS PASCATRTN
  234.           JSR PASNAMES   ;Transfer names to data buffer
  235.           BCS PASCATRTN
  236.           BVS PASCATRTN  ;V set when finished
  237.           INC CURBLK     ;Next block
  238.           LDA CURBLK
  239.           CMP #6
  240.           BCC PASCATLP
  241.           CLC
  242. PASCATRTN RTS
  243.                          ;
  244.                          ;Main subroutine to handle ProDOS directory
  245.                          ;
  246. PROCAT    LDA #2
  247.           STA CURBLK     ;Start with block 2
  248. PROCATLP  LDX CURBLK
  249.           LDA #0
  250.           JSR READBLK
  251.           BCS PROCATRTN
  252.           JSR PRONAMES   ;Transfer names to data buffer
  253.           BCS PROCATRTN
  254.           BVS PROCATRTN
  255.           INC CURBLK     ;Next block
  256.           LDA CURBLK
  257.           CMP #6
  258.           BCC PROCATLP
  259.           CLC
  260. PROCATRTN RTS
  261.                          ;
  262.                          ;Main subroutine to handle DOS 3.3 catalog
  263.                          ;
  264. DOSCAT    JSR RDVTOC
  265.           BCS DOSCATRTN
  266. DOSCATLP  JSR NXTSECTOR
  267.           BEQ DOSCATFIN
  268.           BCS DOSCATRTN
  269.           JSR DOSNAMES
  270.           BCS DOSCATRTN
  271.           BVC DOSCATLP
  272. DOSCATFIN CLC
  273. DOSCATRTN RTS
  274.                          ;
  275.                          ;Subroutine to read sector chained to current one
  276.                          ;
  277. NXTSECTOR LDA IBUF
  278.           STA BRWDATA+1
  279.           LDY #0
  280.           STY SCTPTR
  281.           INY
  282.           LDA (SCTPTR),Y ;Track number
  283.           BEQ NXTSRTN
  284.           TAX
  285.           INY
  286.           LDA (SCTPTR),Y ;Sector number
  287.           JSR RDTS
  288.           BCC NXTOK
  289.           JSR READERR
  290.           BCC NXTSECTOR
  291. NXTOK     STA SCTPTR+1
  292. NXTSRTN   RTS            ;C set for err; Z set for end
  293.                          ;
  294.                          ;Subroutine to read VTOC
  295.                          ;
  296. RDVTOC    LDA IBUF
  297.           STA BRWDATA+1
  298.           LDX #17        ;Track 17
  299.           LDA #0         ;Sector 0
  300.           JSR RDTS       ;Read it
  301.           STA SCTPTR+1
  302.           RTS
  303.                          ;
  304.                          ;Subroutine to read block indicated by A,X
  305.                          ;
  306. READBLK   STA BRWBLKNUM+1 ;Store desired block
  307.           STX BRWBLKNUM  ; number in parm table
  308.           LDA IBUF       ;Store address of 
  309.           STA BRWDATA+1  ; input buffer in 
  310.           LDA #0         ; parm table
  311.           STA BRWDATA
  312.           JSR MLI        ;Go get it
  313.           DB RDBLK.C
  314.           DW BRW
  315.           BCS RDBLKRTN
  316.           BIT DISKID
  317.           BVS RDBLKRTN   ;Not Pascal
  318.           INC BRWBLKNUM  ;Put next block
  319.           INC BRWDATA+1  ;In upper half of
  320.           INC BRWDATA+1  ; input buffer
  321.           JSR MLI
  322.           DB RDBLK.C
  323.           DW BRW
  324. RDBLKRTN  RTS
  325.                          ;
  326.                          ;Subroutine to transfer Pascal filename
  327.                          ; to data buffer
  328.                          ;
  329. PASNAMES  BIT FIRSTBLK   ;First entry?
  330.           BPL PACONT     ;No
  331.           LSR FIRSTBLK
  332.           LDA #6
  333.           STA IPTR       ;Points to
  334.           LDA IBUF
  335.           STA IPTR+1     ; volume name (length byte)
  336.           LDY #0
  337.           LDA (IPTR),Y
  338.           JSR GETVNAME
  339.           LDA #24        ;24 bytes to first file entry
  340.           JSR INCIPTR    ;Raise input buffer pointer
  341. PACONT    LDY #0
  342.           LDA (IPTR),Y   ;File type
  343.           STA FTYPE
  344.           LDA #2
  345.           JSR INCIPTR    ;Raise input buffer pointer
  346.           LDA (IPTR),Y   ;Filename length
  347.           STA FNMLNGTH
  348.           BNE PANXT
  349.           BIT SETV       ;End of catalog
  350.           BVS PARTN      ; V set to quit
  351. PANXT     LDX #5
  352.           JSR PUTOSNM    ;Transfer system name
  353.           JSR PUTVNAME   ;Transfer volume name
  354.           JSR TXFNAME    ;Transfer file name
  355.           LDA FTYPE
  356.           ASL
  357.           ASL
  358.           CLC
  359.           ADC #4
  360.           TAX
  361.           LDA #4
  362.           JSR PUTTYPE    ;Transfer file type
  363.           LDA #24        ;24 more bytes per file entry
  364.           JSR INCIPTR    ;Raise input buffer pointer
  365.           BCC PACONT
  366.           LDA IBUF       ;Reset pointer hi byte
  367.           STA IPTR+1     ; (leave low byte intact)
  368. PARTN     CLC
  369.           RTS
  370.                          ;
  371.                          ;Subroutine to transfer ProDOS filename
  372.                          ; to data buffer
  373.                          ;
  374. PRONAMES  BIT FIRSTBLK   ;First entry?
  375.           BPL PRCONT     ;No
  376.           LSR FIRSTBLK
  377.           LDA #4
  378.           STA IPTR       ;Points to
  379.           LDA IBUF
  380.           STA IPTR+1     ; volume name (length byte)
  381.           LDY #0
  382.           LDA (IPTR),Y
  383.           AND #$0F       ;Isolate volume name length
  384.           JSR GETVNAME
  385.           LDA #39
  386.           JSR INCIPTR    ;Raise input buffer pointer
  387. PRCONT    LDY #0         ;Get length
  388.           LDA (IPTR),Y   ; of filename
  389.           BEQ PRCHKEND   ;Deleted file or end of cat
  390.           AND #$0F       ;Isolate file name length
  391.           STA FNMLNGTH
  392.           LDY #$10
  393.           LDA (IPTR),Y   ;File type
  394.           LDY #12
  395. PRTYPLP   DEY
  396.           BEQ PRSTTYP
  397.           CMP PRCODES,Y
  398.           BNE PRTYPLP
  399. PRSTTYP   STY FTYPE
  400.           LDX #11
  401.           JSR PUTOSNM    ;Transfer system name
  402.           JSR PUTVNAME   ;Transfer volume name
  403.           JSR TXFNAME    ;Transfer file name
  404.           LDA FTYPE
  405.           ASL
  406.           CLC
  407.           ADC FTYPE
  408.           ADC #PRTYPES-TYPES+3
  409.           TAX
  410.           LDA #3
  411.           JSR PUTTYPE    ;Transfer file type
  412.           JMP PRNXT
  413. PRCHKEND  INY
  414.           LDA (IPTR),Y   ;Check first letter of filename
  415.           BNE PRNXT      ;Deleted file; try next
  416.           BIT SETV       ;File never was; end of catalog
  417.           BVS PRRTN
  418. PRNXT     LDA #39        ;39 bytes per file entry
  419.           JSR INCIPTR    ;Raise input buffer pointer
  420.           BCC PRCONT
  421.           LDA IBUF       ;Reset pointer hi byte
  422.           STA IPTR+1
  423.           LDA #4         ; and pointer low byte
  424.           STA IPTR
  425.           CLV            ;Keep going
  426. PRRTN     CLC
  427.           RTS
  428.                          ;
  429.                          ;Subroutine to transfer DOS3.3 filename
  430.                          ; to data buffer
  431.                          ; Enter with hi byte of sector buffer in A
  432.                          ;
  433. DOSNAMES  STA IPTR+1     ;Pick right half of block
  434.           LDA #11        ;Points to track
  435.           STA IPTR       ; byte ($FF if deleted)
  436.           BIT FIRSTBLK   ;First entry?
  437.           BPL DSSCTLP    ;No
  438.           LSR FIRSTBLK
  439.           LDY #<NAMEMSG
  440.           LDX #>NAMEMSG
  441.           LDA #10
  442.           JSR MESSAGE    ;Ask for disk name
  443.           JSR CROUT
  444.           JSR NXTCHAR    ;Accept name
  445.           STX VOLNAME
  446. DSNMLP    LDA INPUT-1,X
  447.           AND #$7F
  448.           STA VOLNAME,X
  449.           DEX
  450.           BNE DSNMLP
  451. DSSCTLP   LDY #0
  452.           LDA (IPTR),Y   ;Check track ($FF if deleted)
  453.           BEQ DSDONE     ;End of catalog
  454.           CMP #$FF
  455.           BNE DSGOOD
  456.           LDA #35        ;Skip deleted file
  457.           BNE DSDLTD
  458. DSGOOD    INC IPTR
  459.           INC IPTR
  460.           LDA (IPTR),Y   ;Y is still 0
  461.           AND #$7F
  462.           BEQ DSSTTYP
  463. DSTYPLP   INY
  464.           LSR
  465.           BCC DSTYPLP
  466.           TYA
  467. DSSTTYP   STA FTYPE
  468.           LDX #17
  469.           JSR PUTOSNM    ;Transfer system name
  470.           JSR PUTVNAME   ;Transfer volume name
  471.           LDY #31
  472.           LDA #$A0       ;Space
  473. TRSPLP    DEY            ;Skip trailing spaces
  474.           CMP (IPTR),Y
  475.           BEQ TRSPLP
  476.           STY FNMLNGTH
  477.           JSR TXFNAME    ;Transfer file name
  478.           CLC
  479.           LDA FTYPE
  480.           ADC #DOSTYPES-TYPES+1
  481.           TAX
  482.           LDA #1
  483.           JSR PUTTYPE    ;Transfer file type
  484.           LDA #33        ;35 bytes per file entry
  485. DSDLTD    JSR INCIPTR    ;Raise input buffer pointer
  486.           CMP SCTPTR+1
  487.           BEQ DSSCTLP    ;Still more in this sector
  488.           CLV            ;Ask for another sector
  489.           CLC            ;No error yet
  490.           RTS
  491. DSDONE    CLC
  492.           BIT SETV
  493.           RTS
  494.                          ;
  495.                          ;Set up volume name
  496.                          ;Enter with length in A
  497.                          ;
  498. GETVNAME  TAY
  499.           STA VOLNAME
  500. GVNMLP    LDA (IPTR),Y
  501.           STA VOLNAME,Y
  502.           DEY
  503.           BNE GVNMLP
  504.           RTS
  505.                          ;
  506.                          ;Transfer system name
  507.                          ;
  508. PUTOSNM   LDY #6
  509.           LDA #$0D       ;Put <RETURN>
  510. POSNMLP   STA (DATPTR),Y ; at end
  511.           LDA OSNAMES,X  ;Read system name
  512.           DEX            ; out of table
  513.           DEY
  514.           BPL POSNMLP
  515.           LDA #6
  516.           JSR INCDPTR    ;Raise data pointer
  517.           RTS
  518.                          ;
  519.                          ;Transfer volume name
  520.                          ;
  521. PUTVNAME  LDA #$0D
  522.           LDY VOLNAME    ;Put <RETURN>
  523.           STA (DATPTR),Y ; at end
  524.           BEQ NULLNAME   ;No name 
  525. PVNMLP    LDA VOLNAME,Y
  526.           DEY
  527.           STA (DATPTR),Y
  528.           BNE PVNMLP
  529. NULLNAME  LDA VOLNAME
  530.           JSR INCDPTR    ;Raise data pointer
  531.           RTS
  532.                          ;
  533.                          ;Transfer filename
  534.                          ;Enter with namelength in Y
  535.                          ;
  536.           MSB OFF
  537. TXFNAME   LDY FNMLNGTH
  538.           LDA #$0D       ;Put <RETURN>
  539.           STA (DATPTR),Y ; at end
  540. TXFNLP    LDA (IPTR),Y
  541.           ORA #$80       ;to make UPCASE work
  542.           CMP #$A0       ;Space
  543.           BCS NOTCNTRL
  544.           LDA #'^'       ;Substitute cntrl chars
  545. NOTCNTRL  JSR UPCASE
  546.           AND #$7F       ;ProDOS keeps bit 7 clear
  547.           DEY
  548.           STA (DATPTR),Y
  549.           BNE TXFNLP
  550.           LDA FNMLNGTH
  551.           JSR INCDPTR    ;Raise data pointer
  552.           RTS
  553.                          ;
  554.                          ;Transfer file type
  555.                          ;
  556. PUTTYPE   PHA
  557.           TAY
  558.           LDA #$0D       ;Put <RETURN>
  559.           STA (DATPTR),Y ; at end
  560. PTLP      DEX
  561.           DEY
  562.           BMI PTXT
  563.           LDA TYPES,X
  564.           STA (DATPTR),Y
  565.           BNE PTLP
  566. PTXT      PLA
  567.           JSR INCDPTR    ;Raise data pointer
  568.           RTS
  569.                          ;
  570.                          ;Increase DATPTR by one more than
  571.                          ; the value in A
  572.                          ;
  573. INCDPTR   SEC
  574.           ADC DATPTR
  575.           STA DATPTR
  576.           LDA DATPTR+1
  577.           ADC #0
  578.           STA DATPTR+1
  579.           RTS
  580.                          ;
  581.                          ;Increase IPTR by the value in A
  582.                          ; and compare IPTR to buffer limit
  583.                          ;
  584. INCIPTR   CLC
  585.           ADC IPTR
  586.           STA IPTR
  587.           LDA IPTR+1
  588.           ADC #0
  589.           STA IPTR+1
  590.           CMP IBUFTOP
  591.           RTS
  592.                          ;
  593.                          ;Subroutine to read given track and sector
  594.                          ; On entry, track in X, sector in A
  595.                          ; Calling routine must set up BRWUNIT and point
  596.                          ;  BRWDATA to base of 512-byte buffer
  597.                          ; On exit, A will point to the
  598.                          ;  appropriate half of the data buffer
  599.                          ;
  600. RDTS      TAY
  601.           TXA
  602.           LDX #0
  603.           STX BRWBLKNUM+1
  604.           ASL            ;Block number
  605.           ASL            ; is 8 times
  606.           ASL            ; track number plus
  607.           ROL BRWBLKNUM+1 ; offset defined by
  608.           CLC            ; sector number
  609.           ADC OFFSET,Y
  610.           STA BRWBLKNUM
  611.           CLC
  612.           LDA HALFTABLE,Y ;Only one half of
  613.           ADC BRWDATA+1  ; block will have
  614.           STA SECTOR     ; relevant data
  615.           JSR MLI
  616.           DB RDBLK.C
  617.           DW BRW
  618.           BCC RDOK
  619.           JMP BADCALL    ;Return by way of BADCALL
  620. RDOK      LDA SECTOR
  621.           RTS
  622.                          ;
  623.                          ;Prompting subroutine allows retry for I/O error
  624.                          ; or PATH NOT FOUND -- returns C clear for <return>
  625.                          ; or <space>, C set and A=0 for <esc>, C set and
  626.                          ; A=error for other errors
  627.                          ;
  628. SRCEPRMPT LDX #>SRCEMSG
  629.           LDY #<SRCEMSG
  630.           BNE PROMPT     ;Always
  631. DESTPRMPT LDX #>DESTMSG
  632.           LDY #<DESTMSG
  633.           BNE PROMPT     ;Always
  634. READERR   STA ERRCODE    ;Save error code
  635.           JSR CLOSE      ;Try to close files
  636.           LDA ERRCODE
  637.           CMP #6         ;Prompt if error is 6,7 or 8
  638.           BCC ERRRTN     ; (Path not found 
  639.           CMP #9         ; or I/O error)
  640.           BCS ERRRTN     ;Return with some other error
  641.           LDX #>RDERRMSG
  642.           LDY #<RDERRMSG
  643.           BNE PROMPT     ;Always
  644. WRITERR   STA ERRCODE    ;Save error code
  645.           JSR CLOSE      ;Try to close files
  646.           LDA ERRCODE
  647.           CMP #4         ;Write-protected
  648.           BNE WRER1
  649.           LDX #>WRPRTMSG
  650.           LDY #<WRPRTMSG
  651.           BNE PROMPT     ;Always
  652. WRER1     CMP #9         ;Disk full
  653.           BEQ WRER2
  654.           CMP #$11       ;Directory full
  655.           BNE WRER3
  656. WRER2     LDX #>FULLMSG
  657.           LDY #<FULLMSG
  658.           BNE PROMPT     ;Always
  659. WRER3     LDX #>WRERRMSG ;Misc write error
  660.           LDY #<WRERRMSG
  661. PROMPT    LDA #10
  662.           JSR MESSAGE
  663. PROMPT1   LDY #<ACTIONREQ
  664.           LDX #>ACTIONREQ
  665.           LDA #11
  666.           JSR MESSAGE    ;Display prompt
  667. KEY       JSR RDKEY      ;Wait for a keystroke
  668.           TAX            ;Save keystroke
  669.           JSR CROUT
  670.           CPX #$8D       ;<RETURN>
  671.           BEQ RETRY      ;Clear C to try again
  672.           CPX #$A0       ;<SPACE>
  673.           BEQ RETRY      ;Clear C to try again
  674.           LDA #0         ;Code for no error
  675.           CPX #$9B       ;<ESC>
  676.           BEQ ERRRTN     ;False error to get out
  677.           BNE PROMPT1
  678. ERRRTN    SEC            ;C set means error
  679.           RTS
  680. RETRY     CLC
  681.           RTS
  682.                          ;
  683.                          ;Subroutine to print message or prompt
  684.                          ;
  685. MESSAGE   STX PRTPTR     ;Point to 
  686.           STY PRTPTR+1   ; appropriate message
  687.           JSR TABV       ;Vertical tab
  688.           JSR CROUT      ;Start new line
  689.           JSR CLREOP
  690.           LDY #0
  691.           LDA (PRTPTR),Y ;Get length of message
  692.           TAX            ;Use X as counter
  693. PRTLP     INY            ; and Y as pointer
  694.           LDA (PRTPTR),Y
  695.           BIT MACHID
  696.           BMI PRTOUT     ;On Apple II, change
  697.           JSR UPCASE     ; lower case to upper
  698. PRTOUT    JSR COUT       ;Print a char
  699.           DEX            ;Count down
  700.           BNE PRTLP      ; until done
  701.           RTS
  702.                          ;
  703.                          ;Subsubroutine to convert lower case
  704.                          ;
  705.           MSB ON
  706. UPCASE    CMP #'a'
  707.           BCC UCRTN
  708.           CMP #'{'
  709.           BCS UCRTN
  710.           AND #$DF
  711. UCRTN     RTS
  712.                          ;
  713.                          ;Subroutine to write accumulated directories
  714.                          ; to file
  715.                          ;
  716. OUTFILE   EQU *
  717.           JSR PREFIX     ;Get prefix and filename
  718.           BCS OFRTN1
  719.                          ;Create a TCAT file--complain if it already exists
  720.           LDA #$C3       ;Full access
  721.           STA CRACESS
  722.           LDA #4         ;Text
  723.           STA CRFILID
  724.           LDA #0
  725.           STA CRAUXID
  726.           STA CRAUXID+1
  727.           LDA #1         ;Seedling file
  728.           STA CRFKIND
  729.           LDA #CREATE.C
  730.           JSR GOSYSTEM
  731.           BCC OFOPEN
  732.           CMP #$13       ;Duplicate filename
  733.           BEQ APPNDQ     ;File already exists
  734.           SEC
  735. OFRTN1    RTS            ;Real error
  736.                          ;Append or replace an existing TCAT file
  737. APPNDQ    LDY #<APPNDMSG ;File already exists
  738.           LDX #>APPNDMSG ; notify user and
  739.           LDA #10        ; ask whether to
  740.           JSR MESSAGE    ; append or replace
  741.           LDY #<APPNDREQ
  742.           LDX #>APPNDREQ
  743.           LDA #11
  744.           JSR MESSAGE
  745.           JSR KEY        ;Get answer
  746.           ROR APPNDFLG   ; and save it 
  747.                          ;Open TCAT
  748. OFOPEN    LDY #<WRITEMSG
  749.           LDX #>WRITEMSG
  750.           LDA #10
  751.           JSR MESSAGE
  752.           JSR PREFIX     ;Get prefix and filename
  753.           BCS OFRTN1
  754.           LDA IBUF
  755.           STA OSYSBUF+1
  756.           LDA #0
  757.           STA OSYSBUF
  758.           LDA #OPEN.C    ;Open file
  759.           JSR GOSYSTEM
  760.           BCS OFRTN2
  761.                          ;Set up to append, if necessary
  762.           BIT APPNDFLG   ;Do we append?
  763.           BMI OFWRT
  764.           LDA OREFNUM    ;Append info to end
  765.           STA SREFNUM    ; of file
  766.           LDA #GETEOF.C  ; by setting
  767.           JSR GOSYSTEM   ; file mark
  768.           BCS OFRTN2     ; equal to 
  769.           LDA #SETMARK.C ; end-of-file
  770.           JSR GOSYSTEM
  771.           BCS OFRTN2
  772.                          ;Write the data
  773. OFWRT     LDA OREFNUM
  774.           STA RWREFNUM
  775.           LDA #<END+$100
  776.           STA RWDATA+1   ;Beginning of 
  777.           LDA #0         ; data buffer
  778.           STA RWDATA
  779.           LDA DATPTR     ;Number of bytes
  780.           STA RWCOUNT    ; of data in
  781.           SEC            ; the buffer
  782.           LDA DATPTR+1
  783.           SBC RWDATA+1
  784.           STA RWCOUNT+1
  785.           LDA #WRITE.C
  786.           JSR GOSYSTEM   ;Write it!
  787.           BCS OFRTN2
  788.                          ;Adjust the end-of-file mark
  789.           LDA OREFNUM
  790.           STA SREFNUM
  791.           LDA #GETMARK.C ;Set new
  792.           JSR GOSYSTEM   ; end-of-file
  793.           BCS OFRTN2     ; equal to 
  794.           LDA #SETEOF.C  ; file mark
  795.           JSR GOSYSTEM   ; in case new file
  796.           BCS OFRTN2     ; is shorter than old
  797.                          ;Close the file
  798.                          ;Warning--this is also used as an independent subroutine
  799. CLOSE     LDA OREFNUM
  800.           STA CREFNUM
  801.           LDA #CLOSE.C   ;Close up
  802.           JSR GOSYSTEM
  803. OFRTN2    RTS
  804.                          ;
  805.                          ;Subroutine to get prefix and filename
  806.                          ;
  807.           MSB OFF
  808. PREFIX    LDA VPATH1
  809.           STA PRTPTR
  810.           LDA VPATH1+1
  811.           STA PRTPTR+1
  812.           LDA PFIXPTR    ;Is there a prefix?
  813.           BNE HAVEPFX    ;Yes
  814.           LDA OFILENAME+1 ;Full pathname available?
  815.           CMP #'/'
  816.           BNE GETPFX     ;No, get prefix
  817. HAVEPFX   LDY #0         ;If so, set up
  818.           LDA OFILENAME  ; to transfer only filename
  819.           STA (PRTPTR),Y
  820.           TAY
  821.           TAX
  822.           BNE OFNMLP     ;Always
  823. GETPFX    LDA DEFDRV     ;Get volume name
  824.           ASL            ; of current default
  825.           ASL            ; device by getting
  826.           ORA DEFSLT     ; current slot and
  827.           ASL            ; drive number and
  828.           ASL            ; calling OnLine to
  829.           ASL            ; get volume name
  830.           ASL
  831.           STA SUNITNUM
  832.           LDX VPATH1
  833.           INX
  834.           STX SBUFADR
  835.           LDX VPATH1+1
  836.           STX SBUFADR+1
  837.           LDA #ONLINE.C
  838.           JSR GOSYSTEM
  839.           BCS PFXRTN
  840.           LDY #1
  841.           LDA (PRTPTR),Y Isolate prefix length
  842.           AND #$0F       ; from first byte
  843.           ADC #$02       ;Increase name length
  844.           PHA            ; to allow for initial /
  845.           LDA #'/'       ; and trailing /
  846.           STA (PRTPTR),Y ;Add the first /
  847.           PLA            ;Recover prefix length
  848.           TAY
  849.           LDA #'/'
  850.           STA (PRTPTR),Y ;Add trailing /
  851.           TYA
  852.           CLC            ;Add filename length
  853.           ADC OFILENAME
  854.           LDY #0
  855.           STA (PRTPTR),Y ;Store pathname length
  856.           TAY
  857.           LDX OFILENAME  ;Counter for filename length
  858. OFNMLP    LDA OFILENAME,X ;Add filename to end
  859.           STA (PRTPTR),Y ; of prefix
  860.           DEY
  861.           DEX
  862.           BNE OFNMLP
  863.           CLC            ;No error
  864. PFXRTN    RTS
  865.                          ;
  866.                          ;Text, tables of data, and workspace
  867.                          ;
  868.           MSB ON
  869.           REP 32
  870. BANNER0   ASC '           DISK LIBRARIAN PRO'
  871.           DB $8D
  872.           ASC '              by Ken Manly'
  873.           DB $8D
  874.           ASC ' Copyright (C) 1986 by MicroSPARC, Inc.'
  875.           DB $8D,$8D
  876. BANNER1   EQU *
  877.           REP 32
  878.                          ;
  879.                          ;Parameter list for Readblock and Writeblock
  880.                          ;
  881. BRW       DFB 3
  882. BRWUNIT   DFB 0
  883. BRWDATA   DW 0
  884. BRWBLKNUM DW 0
  885.                          ;
  886.                          ;Table to convert DOS sectors to ProDOS blocks
  887.                          ;
  888. OFFSET    DFB 0,7,6,6,5,5,4,4
  889.           DFB 3,3,2,2,1,1,0,7
  890.                          ;
  891.                          ;Table to choose right half of a block
  892.                          ; for a requested sector
  893.                          ;
  894. HALFTABLE DFB 0,0,1,0
  895.           DFB 1,0,1,0
  896.           DFB 1,0,1,0
  897.           DFB 1,0,1,1
  898.                          ;
  899.                          ;Characteristic bytes for each type of disk
  900.                          ; Pascal, ProDOS, DOS master, DOS slave
  901.                          ; Two of each to allow for expansion
  902.                          ;
  903. IDLIST    DB $6,$6,$3,$3,$A9,$A9,$0,$0
  904.                          ;
  905.                          ;Codes to identify type of disk
  906.                          ; Pascal, ProDOS, DOS master, DOS slave
  907.                          ; Two of each to allow for expansion
  908.                          ;
  909. IDBYTES   DB $0,$0,$C0,$C0,$80,$80,$80,$80
  910.                          ;
  911.                          ;Filename for catalog listing
  912.                          ;
  913.           MSB OFF
  914. OFILENAME STR 'TCAT'
  915.           DS 16-*+OFILENAME ;Extra space for filename
  916.                          ;
  917.           MSB ON
  918. SRCEMSG   STR 'Ready to read a disk catalog . . .'
  919. ACTIONREQ STR 'Press <RETURN> to go, <ESC> to quit '
  920. READMSG   STR 'Reading catalog . . .'
  921. NAMEMSG   STR 'Enter a name for this DOS disk . . .'
  922. DESTMSG   STR 'Insert disk for catalog file . . .'
  923. RDERRMSG  STR 'Cannot read a disk, try again . . .'
  924. WRPRTMSG  STR 'Disk is write-protected. . .'
  925. FULLMSG   STR 'Disk full, try another. . .'
  926. WRERRMSG  STR 'Cannot write to disk, try another. . .'
  927. APPNDMSG  STR 'Catalog file already exists . . .'
  928. APPNDREQ  STR '<RETURN> to append, <ESC> to replace '
  929. WRITEMSG  STR 'Writing TCAT file . . .'
  930. BYE       STR 'Goodbye . . .'
  931.                          ;
  932.           MSB OFF
  933. OSNAMES   ASC 'PASCALPRODOSDOS3.3'
  934.                          ;
  935. PRCODES   DFB 0,1,4,6,$F,$19,$1A,$1B,$FC,$FD,$FE,$FF
  936. TYPES     ASC 'VOL BAD CODETEXTINFODATAGRAFFOTO'
  937. PRTYPES   ASC '???BADTXTBINDIRADBAWPASPBASVARRELSYS'
  938. DOSTYPES  ASC 'TIABSRAB'
  939.                          ;
  940. FIRSTBLK  DS 1
  941. DISKID    DS 1
  942. IBUF      DS 1
  943. CURBLK    DS 1
  944. ERRCODE   DS 1
  945. SECTOR    DS 1
  946. IDEV      DS 1
  947. VOLNAME   DS 16
  948. FTYPE     DS 1
  949. IBUFTOP   DS 1
  950. DBUFTOP   DS 1
  951. FNMLNGTH  DS 1
  952. APPNDFLG  DS 1
  953.                          ;
  954. END       EQU *
  955.